/** ***********************************************************************************
* @file         power_task.h
* @brief        系统电源管理任务 头文件
* @details      主要用来管理整个系统的工作状态
* @author       杨小珛
* @date         2021/01/09
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/

#ifndef POWER_TASK_H
#define POWER_TASK_H

#include "os_app.h"
#define POWER_MAN_SAM_REV_RUN_TIME      ( 100 )    /* 电源管理等待信号量时间 */
#define POWER_MAN_SAM_REV_STOP_TIME     ( 5000 )    /* 电源管理等待信号量时间 */

#define SYSTEM_DELAY_FLAG_SET           ( 0x01 )    /* 系统休眠延时设置 */
#define SYSTEM_DELAY_FLAG_CLEAR         ( 0x00 )    /* 系统延时清除标识 */

#define POWER_MAN_TASK_INTO_SLEPP_TIME      ( 3 )   /* 系统进入休眠管理的时间，单位S*/
/*---------------------------------------------------------------------------------------
                             需要管理的任务模块名称
----------------------------------------------------------------------------------------*/
#define TASK_NAME_LEN  16 

#define CAN_MAN_NAME    "CAN_MAN_TASK"
#define NET_MAN_NAME    "NET_MAN_TASK"
#define GPS_MAN_NAME    "GPS_MAN_TASK"
#define RTC_MAN_NAME    "RTC_MAN_TASK"
#define GSEN_MAN_NAME   "GSEN_MAN_TASK"
#define LBS_MAN_NAME    "LBS_MAN_TASK"
#define BAT_MAN_NAME    "BAT_MAN_TASK"
#define OTA_MAN_NAME    "OTA_MAN_TASK"
#define AGPS_MAN_NAME   "AGPS_MAN_TASK"
#define DTC_MAN_NAME    "DTC_MAN_TASK"
#define MCU_MAN_NAME    "MCU_MAN_TASK"
#define BLE_MAN_NAME    "BLE_MAN_TASK"
#define MCU_CFG_NAME    "MCU_CFG_TASK"

#define POW_MAN_NAME    "PWR_MAN_TASK"

#define EVENT_MAN_NAME  "EVENT_MAN_TASK"
#define PORT_MAN_NAME   "PORT_MAN_TASK"

#define SYS_ALL_NAME    "SYS_ALL_TASK"

#define POW_MAN_UNREG       ( 0xFF )
#define TASK_POWER_NUM      ( 20 )
#define SLEEP_WITE_TIMEOUT  ( 70 )

/*---------------------------------------------------------------------------------------
                             任务模块运行的状态
----------------------------------------------------------------------------------------*/
typedef enum
{
    TASK_MODE_INIT = 0x00,       ///< 任务模块状态初始化
    TASK_RUN_MODE,               ///< 任务模块运行状态
    TASK_SLEEP_MODE,             ///< 任务模块睡眠状态
    TASK_STOP_MODE,              ///< 任务模块停止状态
} task_modules_e;

/*---------------------------------------------------------------------------------------
                             电源管理唤休眠唤醒状态结构体
----------------------------------------------------------------------------------------*/
typedef enum
{
    POWER_INIT = 0x00,
    POWER_RTC,
    POWER_BLE,  
    POWER_CAN,
    POWER_GSEN,
    POWER_NET,
    POWER_TIME,
} wakeup_source_e;

typedef struct
{
    union //状态
    {
        volatile uint8_t event;          /* 系统唤醒源*/
        struct
        {
            volatile uint8_t rtc        : 1;
            volatile uint8_t ble        : 1;
            volatile uint8_t can        : 1;
            volatile uint8_t gsen       : 1;
            volatile uint8_t net        : 1;
            volatile uint8_t time       : 1;
            volatile uint8_t rsv2       : 2;
        };
    };
}wakeup_event_t;

typedef struct
{
    wakeup_source_e wakeup_source;      /*系统唤醒源*/
    wakeup_event_t wakeup_event;        /*系统唤醒后事件*/
    uint32_t task_run_num;              /*任务运行的状态，0停止运行*/
} power_man_wakeup_source_list_t;


/*****************************************************************************************
                            系统电源管理属性结构体
******************************************************************************************/

typedef void task_manage_trigger_hook( uint32_t task_id );

typedef struct
{
    uint32_t task_id;                   ///< 任务创建的节点
    task_modules_e task_state;          ///< 设置任务运行的状态
    task_modules_e save_state;          ///< 任务当前的状态
    uint8_t *task_name;                 ///< 注册管理任务的名称
} power_system_man_s;

typedef struct //全部采用BCD码
{
    volatile uint8_t st;            /*GPS任务管理寄存器的状态*/
    volatile uint8_t id;            /*GPS任务管理寄存器的ID*/
} power_task_manage_s;              /*GPS任务电源管理状态*/

/*****************************************************************************************
                            系统电源管理的运行状态
******************************************************************************************/
typedef enum
{
    SYSTEM_RUN_INIT = 0,            /*系统运行初始化*/
    SYSTEM_RUN_START,               /*系统运行开始*/
} system_run_t;


/*---------------------------------------------------------------------------------------
                             系统休眠时间管理结构体
----------------------------------------------------------------------------------------*/
typedef enum
{
    WAKEUP_TIME_INIT = 0,            /*系统唤醒时间标志位初始化*/
    WAKEUP_TIME_OUT,                 /*系统唤醒时间溢出*/
} wakeup_time_make_e;

typedef struct 
{
    wakeup_time_make_e  run_over_make;
    volatile uint32_t run_tick;
    wakeup_time_make_e  sleep_over_make;
    volatile uint32_t sleep_tick;
} power_man_sleep_time_manage_t; 

#define POWER_MAN_TIME_PERIOD ( 120 * GAOZ_TICK_PERIOD_S ) /*当ACC低电平时系统进入休眠需要等待10分钟左右，需要等待向平台上传10次数据*/

#define POWER_MAN_WAKEUP_SLEEP_TIME_PERIOD ( 15 * GAOZ_TICK_PERIOD_S )
#define POWER_MAN_WAKEUP_RUN_TIME_PERIOD ( 3 * GAOZ_TICK_PERIOD_S )

#define POWER_MAN_GSEN_MAX_TIME ( 5 )

typedef enum
{
	POWER_SLEEP_INIT = 0,		    /*电源管理初始化*/	 
    POWER_SLEEP_DALAY,              /*系统休眠等待延时*/
    POWER_SLEEP_BLE,                /*电源管理BLE的运行状态*/
	POWER_SLEEP_CAN,                /*电源管理CAN的运行状态*/
	POWER_SLEEP_BAT,	            /*电源管理备用电池状态*/	 
	POWER_SLEEP_SYS,                /*电源管理初始化系统*/	 
} power_man_sys_t;

typedef enum
{   
    POWER_NET_INIT = 0,             /*设置网络初始化*/
    POWER_NET_RUN,                  /*设置网络处于运行状态*/
    POWER_NET_WAIT,                 /*设置网络处理等待状态*/
    POWER_NET_SLEEP,                /*设置系统处于休眠状态*/
} power_man_net_t;

typedef enum
{   
    POWER_RTC_INIT = 0,             /*设置RTC初始化*/
    POWER_RTC_RUN,                  /*设置RTC处于运行状态*/
    POWER_RTC_WAIT,                 /*设置RTC处理等待状态*/
    POWER_RTC_SLEEP,                /*设置RTC处于休眠状态*/
} power_man_rtc_t;

typedef enum
{   
    POWER_CAN_INIT = 0,             /*设置CAN初始化*/
    POWER_CAN_RUN,                  /*设置CAN处于运行状态*/
    POWER_CAN_WAIT,                 /*设置CAN处理等待状态*/
    POWER_CAN_SLEEP,                /*设置CAN处于休眠状态*/
} power_man_can_t;

/** ****************************************************************************
* @remarks       void power_man_create_task(unsigned portBASE_TYPE uxPriority)
* @brief         创建系统电源管理任务
* @param[in]     uxPriority 任务优先级
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void power_man_create_task(unsigned portBASE_TYPE uxPriority);

/** ****************************************************************************
* @remarks       void power_man_semaphore_put(void)
* @brief         系统电源管理信号发送
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void power_man_semaphore_put(void);

/** ****************************************************************************
* @remarks       uint32_t power_man_task_reg( uint8_t *task_name, uint8_t * power_id )
* @brief         注册任务管理器
* @param[in]     *task_name 任务名称
* @param[out]    * power_id 电源管理ID地址
* @return        pdPASS 创建成功 ， pdFAIL 创建失败
* @attention     必须在任务中执行此函数
*******************************************************************************/
extern uint32_t power_man_task_reg( uint8_t *task_name, uint8_t * power_id );

/** ****************************************************************************
* @remarks       uint32_t power_man_remove_task(void)
* @brief         删除任务管理器
* @param[in]     无
* @param[out]    无
* @return        pdPASS 删除成功 ， pdFAIL 删除失败
* @attention     必须在任务中执行此函数
*******************************************************************************/
extern uint32_t power_man_remove_task(void);

/** ****************************************************************************
* @remarks       task_modules_e power_man_task_state_get( uint8_t power_id )
* @brief         获取系统任务当前的状态
* @param[in]     power_id 电源管理ID信息
* @param[out]    无
* @return        任务的状态
* @attention     无
*******************************************************************************/
extern task_modules_e power_man_task_state_get( uint8_t power_id );

/** ****************************************************************************
* @remarks       void power_man_task_state_set(uint8_t power_id , task_modules_e state)
* @brief         设置当前任务保存的状态
* @param[in]     power_id :任务电源管理的ID 
* @param[in]     state :任务的状态
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void power_man_task_state_set(uint8_t power_id , task_modules_e state);

/** ****************************************************************************
* @remarks       task_modules_e power_man_save_state_get( uint8_t power_id )
* @brief         获取执行任务保存的状态
* @param[in]     power_id 电源管理ID信息
* @param[out]    无
* @return        当前任务的状态 task_modules_e
* @attention     无
*******************************************************************************/
extern uint8_t power_man_save_state_get( uint8_t power_id );

/** ****************************************************************************
* @remarks       void power_man_save_state_set(uint8_t power_id , task_modules_e state)
* @brief         设置当前任务保存的状态
* @param[in]     power_id :任务电源管理的ID
* @param[in]     state :任务的状态
* @param[out]    无
* @return        当前任务的状态 task_modules_e
* @attention     无
*******************************************************************************/
extern void power_man_save_state_set(uint8_t power_id , task_modules_e state);

/** ****************************************************************************
* @remarks       uint8_t power_man_count_get(void)
* @brief         获取电源管理任务的数量
* @param[in]     无
* @param[out]    无
* @return        创建电源管理任务的数量
* @attention     无
*******************************************************************************/
extern uint8_t power_man_count_get(void);

/** ****************************************************************************
* @remarks       void power_man_wakeup_source_set( wakeup_source_e source )
* @brief         设置系统的唤醒管理列表
* @param[in]     source 系统的唤醒源
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void power_man_wakeup_source_set( wakeup_source_e source );

/** ****************************************************************************
* @remarks       uint32_t power_man_wakeup_source_get( wakeup_event_t *event )
* @brief         获取系统唤醒列表事件
* @param[in]     无
* @param[out]    *event 唤醒事件
* @return        无
* @attention     无
*******************************************************************************/
extern uint32_t power_man_wakeup_source_get( wakeup_source_e source );

/** ****************************************************************************
* @remarks       void power_man_wakeup_task_num_run( void )
* @brief         唤醒任务运行
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void power_man_wakeup_task_num_run( void );

/** ****************************************************************************
* @remarks       void power_man_wakeup_task_num_stop( void )
* @brief         唤醒任务停止
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void power_man_wakeup_task_num_stop( void );

/** ****************************************************************************
* @remarks       void power_man_wakeup_task_num_clean( void )
* @brief         唤醒任务清楚
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void power_man_wakeup_task_num_clean( void );

/** ****************************************************************************
* @remarks       void power_man_wakeup_task_num_get( void )
* @brief         唤醒任务获取
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern uint32_t power_man_wakeup_task_num_get( void );

#endif

